package Git2024_5_15;

public class MVC {
    //Spring MVC
    /**
     * MVC
     * 是一种编程领域通用的设计思想 用于解耦 降低各个模块之间的耦合度
     * M: Model 模型层 业务逻辑判断 数据库存取(核心代码)
     * V: View 视图层 界面展示 向用户呈现数据的方式(html页面,图片,文本等)
     * C: Controller 控制器 接收用户请求 根据请求调用相应的模型处理业务逻辑(返回响应)
     *
     * 模型视图控制器-ModelViewController-MVC
     *
     * 过程
     * Controller负责人机交互 -> 将请求信息指令交给Model层 处理业务逻辑
     * -> 例如进入数据库查询或其他操作...
     * -> Model并不会直接连接V层 而是返回给Controller -> Controller接收到M的结果
     * -> Controller生成对应响应传递给View层 -> View生成相应界面
     *
     * 划分三模块原因
     * 后期出错对整体业务逻辑影响较少 只需处理错误对应层级即可
     *
     * 分类及包含关系
     * java: Spring MVC
     *      基于MVC(ModelViewController)模式的web框架
     *      基于Spring框架的子项目 属于Spring Framework中的一员 用于网站开发
     * python: Django Tornado Flask
     */
    /**
     * Spring MVC
     *  用于网络开发
     * 创建时 需要勾选 Web 中的 Spring Web依赖
     * 工程中 存放资源文件的包 resources 中的 static 中存放的是静态文件
     *  (例如index.html)等.html文件---前端文件
     *
     * 当运行Application文件时 会输出多条日志可查看工程相关信息
     *  tomcat web服务 在Spring MVC工程中内嵌的 无需外部搭建 默认启动端口为8080
     *
     * 在static包中创建.html文件并命名(在<title></title>标签中)
     * 设置好后需要
     *  1.再次运行Application用以重启工程 否则.html文件的效果无法生效
     *  2.或者直接右键static包 选择rebuild 'static'即可重启工程
     *
     * <body>--标签框选的内容为正文部分--</body>
     *
     * 此时在浏览器中输入http://localhost:8080/index.html即可进入创建的.html文件的网页
     * 或直接点击idea中,html文件页面右上角的浏览器图标进入
     *
     * 当在网页输入的.html名称错误或路径中的其他错误 会报 404 NOT FOUND 错误
     *
     * 在配置文件的 application.properties 类中 默认了端口为8080: server.port=8080
     * 可手动修改
     */
    //html
    /**
     * 客户端会向服务端发送许多请求
     *
     * 1.静态请求: 内容不变 无论访问者是谁 显示的页面都是一样的---例如新闻页面
     *   1.static目录下创建静态文件: html image
     *   2.右键 static 目录 选择 rebuild 'static'重启工程
     *     若页面依旧未更新 也可将页面的旧内容[缓存内容]刷新以强行更新页面: shift + f5
     *   3.浏览器搜索对应路径即可 例如 http://localhost:8080/index.html
     *
     * 2.动态请求: 需要根据用户提供的信息处理业务逻辑或操作数据库等 并生成动态内容 即返回对应用户的内容---例如不同用户的'我的订单'页面
     *  需要借助java代码
     *  例如 客户端向服务端发送请求 服务端需要进行校验 请求地址: http://localhost:8080/login
     *   1.在工程文件目录下创建 controller 包 在该包中创建 UserController 类
     *   2.在该类中创建方法用于完成需求 例如登陆需求,注册请求等等 [在类上添加@Controller注解]
     *   3.Controller层根据请求地址路径[path]寻找并调用对应方法[在方法上添加@RequestMapping("/URL地址")请求注解]
     *      @RequestMapping("/URL路径") 根据请求的URL地址映射到对应的控制器方法---路径中的第一个"/"可以省略不写
     *   4.在方法上添加@ResponseBody注解
     *      @ResponseBody 允许控制器将控制器的方法以返回值的形式作为响应数据返回给客户端
     *   5.重启工程 ★
     */
    //前端代码
    /**
     * 1.<h1>一级标题</h1> 最多到<h6>六级标题</h6>
     * 2.将图片保存进static包中 重命名例如'xnyxy.jpg'
     *   存入后rebuild 'static' 并在网页输入 http://localhost:8080/xnyxy.jpg 即可查看
     */
    //HTTP协议
    /**
     * HTTP协议
     * 超文本传输协议
     * 应用层协议 浏览器与服务器通讯
     * 规定了浏览器浏览器与服务器之间的交互规则以及交互数据的格式信息等
     *
     * 特点
     *  1.应用层协议 使用tcp(可靠 udp为不可靠)进行数据传输
     *  2.有丰富的请求类型
     *  3.可以传输的数据类型众多
     *
     * 访问页面流程
     *   客户端（浏览器）通过tcp传输，发送http请求给服务端；
     *   服务端接收到http请求后进行解析；
     *   服务端处理请求内容，组织响应内容；
     *   服务端将响应内容以http响应格式发送给浏览器；
     *   浏览器接收到响应内容，解析展示.
     *
     */
    //HTTP的请求与响应
    /**
     * 请求(Request)浏览器给服务端发送的内容
     *  1.请求行[起始行] 具体的请求类别和请求内容
     *  包含:
     *          GET                   /               HTTP/1.1
     *      请求方法/类别          抽象路径(请求路径)        协议版本
     *  常见请求方法(本质没有区别 但是需要遵守行业规范(不是硬性规定)-前端代码一般会按照下列请求类别进行不同的撰写)
     *   GET:    服务器端获取资源[SELECT]   例如: 查看朋友圈等查询请求
     *   POST:   服务端新增资源[INSERT]    例如: 发朋友圈等插入请求
     *   PUT:    更新服务端的资源[UPDATE]   例如: 修改朋友圈等
     *   DELETE: 删除服务端资源[DELETE]    例如: 删除朋友圈等
     *
     *  2.请求头 Request Headers
     *    对当前请求的进一步的解析和描述/附加信息 服务器自身内容 服务器交互细节 服务端正文详情等等
     *      例如 通过 accept字段 中的描述服务器可以得知希望/可以接收什么类型的响应
     *          通过Cookic可以进行会话保持 联络机器人等等操作
     *          通过User-Agent可以得知浏览器内核信息(但是一般浏览器没有自己的内核) 或操作系统的基本信息
     *
     *  3.请求体 客户端传递给服务端的具体的请求数据(用户上传的信息)---服务端必须接收
     *
     * 响应 Response
     *  1.响应行
     *      HTTP/1.1         200            OK
     *      版本信息     响应状态码(例如404)   附加信息
     *  响应码
     *   1xx 保留/临时响应
     *   2xx 成功(最喜欢的)  表示处理完成 并正常响应
     *   3xx 重定向  表示处理成功 但是需要进一步请求
     *   4xx:客户端错误  表示客户端请求错误导致服务端无法处理
     *       例如"404"客户端错误 表示客户端地址输入错误
     *   5xx:服务端错误(最不喜欢的)  表示服务端处理请求过程出现了错误
     *
     *  2.响应头(很少手动设置)
     *   Content-Type   告知客户端响应的类型
     *   Content-Length 告知客户端响应数据大小
     *
     *  3.响应体
     *  服务端返回给客户端的具体数据
     */
    //HTTP与HTTPS的区别
    /**
     * 共同点: 都是超文本传输协议
     * HTTP 安全性: 与网站建立的连接不安全 数据以明文方式传输 不太安全
     *      传输效率: 高
     *      默认端口号: 80
     * HTTPS 安全性: 数据以密文的方式传输 所以相对安全
     *       传输效率: 传输数据涉及到签名和验签(加密解密) 速度相对慢
     *       默认端口号: 443
     *       证书: SSL证书
     *
     * SSL证书 无法自行制作 否则浏览器不承认 只能购买
     *        无证书无法制作HTTPS网站
     *        全世界只有12306敢自己制作SSL证书
     */
    //端口号速记
    /**
     * MySQL MariaDB 3306
     * HTTP 80
     * HTTPS 443
     * html工程启动时 默认监听的端口为HTTP的端口
     */
    //URL
    /**
     * URL组成
     * 例如: http://localhost:8080/v1/users/login?username=xxx&password=yyy
     *      (Protocol)://(Hostname):(Port)/(Path1)/(.2)/(.3)?(Query Parameters)&(Query Parameters)
     *
     * 协议(Protocol) 指定访问资源的协议类型，常见的协议包括HTTP、HTTPS等。
     * 主机名(Hostname) 指定要访问的服务器的主机名或域名。
     * 端口号(Port) 指定服务器的端口号，不同的协议和应用程序使用不同的端口号。
     * 路径(Path) 指定要访问的资源的路径，即文件或文件夹的路径。
     * 查询参数(Query Parameters) 用于传递一些额外的信息给服务器，例如参数化的查询条件
     *
     * URL地址中不能有中文
     * 路径与查询参数之间的分隔符为 "?"
     * 查询参数之间的分隔符为 "&"
     * 区分大小写
     * 不能包含非法字符 如空格 特殊符号等等
     */

    //请求方法
    /**
     * GET请求
     * --适合传输数据量小的情景--
     * 通过查询参数将请求的具体内容传递给服务端
     *  http://localhost:8080/login?查询参数1=Xxx&查询参数2=Yyy
     *
     * POST请求(一般用于新增数据)
     * --适合传输数据量大的情景--
     * 通过请求体的数据传递给服务端-需要:
     * <form action="" method="">
     *     <input type="" name="">
     *     <input type="" value="">
     *         \..
     * </form>
     * 注意
     * POST
     *  数据是私密的 不会显示在URL地址中
     *  长度无限制 可以提交大量数据
     */
    //接收方式
    /**
     * 1.HttpServletRequest接收
     * 发送注册请求 -> 8080端口 被tomcat监听 -> tomcat会创建一个容器 生成HttpServletRequest对象
     * -> 其中包含1.请求的URL地址
     *          2.请求方法
     *          3.请求头
     *          4.请求体
     *          5.请求的IP地址等几乎所有请求信息封装起来
     * -> 发送给服务端
     *
     * 2.数据条数少 通过声明参数方式接收
     * 3.数据条数多 通过POJO类[DTO]接收
     *   将数据存储在单独的类中 方便后续批量操作 提高复用性
     */
    /**
     * 项目开发流程
     *  1.需求文档[产品经理]
     *  2.设计
     *      2.1 UI原型图设计[UI设计师]
     *      2.2 数据库设计(ER图等)[数据架构师]
     *  3.前后端并行开发
     *      3.1 Web前端工程师: 页面
     *      3.2 Java开发工程师: 开发服务端的功能
     *      前提: 服务端开发功能时 是没有前端页面的 需要使用<测试工具>
     *  4.前后端联调
     *  5.测试(多轮测试 例如内测->公测->正式版本)[测试工程师]
     *  6.部署上线
     *  7.运行维护,更新迭代
     */
    /**
     * 测试工具
     * HttpClient(较为基础的测试方式)
     * Knife4j(高级)
     * Postman(高级)
     */
    //HttpClient
    /**
     * 在工程中的test目录中的创建目录 在该目录中创建.http后缀的file文件
     * 在测试文件页面的左上角有加号图标 点击创建请求方法的相关内容 输入对应网址 并在每个测试上输入"### Xxx测试注释"
     * * "### Xxx测试注释" 用以分割每个测试方法 其中"###"为每个测试之间的分隔符
     */
}
